#include "stdafx.h"
#pragma once
//-------------------------------------------------------------------------------------------------
//ImageType.h  - Type of Image            
//-------------------------------------------------------------------------------------------------
//FreeBSD License
//Copyright 2011 Will Stott All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are
//permitted provided that the following conditions are met:
//
//   1. Redistributions of source code must retain the above copyright notice, this list of
//      conditions and the following disclaimer.
//
//   2. Redistributions in binary form must reproduce the above copyright notice, this list
//      of conditions and the following disclaimer in the documentation and/or other materials
//      provided with the distribution.
//
//THIS SOFTWARE IS PROVIDED BY Will Stott ``AS IS'' AND ANY EXPRESS OR IMPLIED
//WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Will Stott OR
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
//ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
//ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//The views and conclusions contained in the software and documentation are those of the
//authors and should not be interpreted as representing official policies, either expressed
//or implied, of Will Stott.
//
//----Authors--------------------------------------------------------------------------------------
//created by: will.stott@ucl.ac.uk Sept 2011
//
//----Comments-------------------------------------------------------------------------------------
//
// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the IMAGEPROCLIB_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// IMAGEPROCLIBAPI functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
//--------------------------------------------------------------------------------------------------

#ifdef IMAGEPROCLIB_EXPORTS
#define IMAGEPROCLIBAPI __declspec(dllexport)
#else
#define IMAGEPROCLIBAPI __declspec(dllimport)
#endif

#include <string>
#include <vector>

#include "TinyXmlLib.h"

#include "ImageTypeProp.h"
#include "ImageProp.h"
#include "ImageObjectType.h"

class IMAGEPROCLIBAPI ImageType 
{
public:
	static const char * const unclassified;
	static const char * const xmlImageTypes;
	static const char * const xmlImageTypesName;
	static const char * const xmlImageType;
	static const char * const xmlImageTypeImageObjects;
	static const char * const xmlImageTypeImageObject;
	static const char * const xmlImageTypeProps;
	static const char * const xmlImageTypeProp;

private:
	std::string		_Name;	

//#pragma warning(disable:4251)
	std::vector<ImageTypeProp *>   _ImageTypeProps;						//properties that a user should specify for images of this type
	std::vector<ImageObjectType *> _ImageObjTypes;						//types of object that may be found in the images of this type
//#pragma warning(default:4251)

public:
	ImageType(void);
	ImageType(const char *name); 
	virtual ~ImageType(void);

	static ImageType *CreateImageType(TiXmlElement *xmlImageType, ResourceList &resourceList); 

	const char     *GetName() { return  _Name.c_str(); }
	void			SetName(const char *name) {  _Name = name; }			

	int				 GetImagePropertyCnt() { return _ImageTypeProps.size(); }
	ImageTypeProp   *GetImageProperty( size_t index) { return  _ImageTypeProps[index]; }

	ImageObjectType *LookupImageObjectType (const char *name);
	int				 GetImageObjectTypeCnt() { return _ImageObjTypes.size(); }
	ImageObjectType *GetImageObjectType( size_t index) { return  _ImageObjTypes[index]; }
	ImageObjectType *GetImageObjectTypeForMenuId( int Id);

	ImageTypeProp   *LookupProperty (const char *name);
	bool			 HasProperty(ImageProp *pImageProp);

private:
	bool		 	 ClearAllLists();

	void		 AddImageObjectTypes(TiXmlElement *xmlImageType, ResourceList &resourceList );
	bool		 AddImageObjectType(ImageObjectType *pObjectType );
	void		 AddProperties(TiXmlElement *xmlImageTypeProps );
	bool		 AddProperty(ImageTypeProp *pImageTypeProp );
};


//-------------------------------------------------------------------------------------------------
//			E N D   O F   F I L E
//-------------------------------------------------------------------------------------------------


